From e57246bd3a17d0157e14f852709d3bbe2f40c9a6 Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Tue, 26 Jun 2007 16:24:41 -0600 Subject: [PATCH] [MINIOS][IA64] mini-os without linux-optimization in hypervisor Make mini-os runnable again without the special linux optimization for the identity mapping in the hypervisor. Signed-off-by: Dietmar Hahn --- extras/mini-os/arch/ia64/ia64.S | 7 ++-- extras/mini-os/arch/ia64/ivt.S | 45 +++++++++++++++----------- extras/mini-os/include/ia64/ia64_cpu.h | 4 +-- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/extras/mini-os/arch/ia64/ia64.S b/extras/mini-os/arch/ia64/ia64.S index 63721b4c36..4374c750e7 100644 --- a/extras/mini-os/arch/ia64/ia64.S +++ b/extras/mini-os/arch/ia64/ia64.S @@ -105,7 +105,7 @@ ENTRY(_start) /* * Now pin mappings into the TLB for kernel text and data */ - mov r18=KERNEL_TR_PAGE_SIZE<<2 + mov r18=KERNEL_TR_PAGE_SIZE< no nested tlb faults! - movl r18=kstack+KSTACK_PAGES * PAGE_SIZE - 16 - TF_SIZE - - //add r18=-TF_SIZE,sp - add r30=0xabab,r0 + /* + * Use the thread stack here for storing the trap frame. + * It's not wired mapped, so nested data tlb faults may occur! + */ + add r18=-TF_SIZE,sp ;; { .mib nop 0x02 @@ -602,7 +600,7 @@ ENTRY(hypervisor_callback) ;; } add sp=-16,r18 // the new stack - alloc r15=ar.pfs,0,0,1,0 // 1 out for do_trap_error + alloc r15=ar.pfs,0,0,1,0 // 1 out for do_hypervisor_callback ;; mov out0=r18 // the trap frame movl r22=XSI_PSR_IC @@ -617,13 +615,8 @@ ENTRY(hypervisor_callback) movl r22=XSI_PSR_IC ;; st4 [r22]=r0 // rsm psr.ic - - add r16=16,sp // load EF-pointer again - ;; - //mov r18=sp - movl r18=kstack+KSTACK_PAGES * PAGE_SIZE - 16 - TF_SIZE + add r18=16,sp // load EF-pointer again ;; - // must have r18-efp, calls rfi at the end. br.sptk restore_tf_rse_switch ;; @@ -654,9 +647,7 @@ ENTRY(trap_error) mov out0=r18 // the trap frame add sp=-16,r18 // C-call abi ;; - - //bsw.1 - movl r30=XSI_BANKNUM + movl r30=XSI_BANKNUM // bsw.1 mov r31=1;; #if defined(BIG_ENDIAN) // swap because mini-os is in BE mux1 r31=r31,@rev;; @@ -752,6 +743,7 @@ IVT_ERR(Alternate_Instruction_TLB, 3, 0x0c00) IVT_ENTRY(Alternate_Data_TLB, 0x1000) mov r30=4 // trap number +adt_common: mov r16=cr.ifa // where did it happen mov r31=pr // save predicates ;; @@ -765,7 +757,7 @@ IVT_ENTRY(Alternate_Data_TLB, 0x1000) // // No return // //adt_regf_addr: -// extr.u r17=r16,60,4 // get region number +// extr.u r17=r16,60,4 // get region number // ;; // cmp.eq p14,p15=0xf,r17 // ;; @@ -799,8 +791,23 @@ adt_reg7_addr: IVT_END(Alternate_Data_TLB) +/* + * Handling of nested data tlb is needed, because in hypervisor_callback() + * the stack is used to store the register trap frame. This stack is allocated + * dynamically (as identity mapped address) and therewidth no tr mapped page! + */ +IVT_ENTRY(Data_Nested_TLB, 0x1400) + + mov r30=5 // trap number + add r28=-TF_SIZE,sp // r28 is never used in trap handling + ;; + mov cr.ifa=r28 + ;; + br.sptk adt_common +IVT_END(Data_Nested_TLB) + + -IVT_ERR(Data_Nested_TLB, 5, 0x1400) IVT_ERR(Instruction_Key_Miss, 6, 0x1800) IVT_ERR(Data_Key_Miss, 7, 0x1c00) IVT_ERR(Dirty_Bit, 8, 0x2000) diff --git a/extras/mini-os/include/ia64/ia64_cpu.h b/extras/mini-os/include/ia64/ia64_cpu.h index 032cc632ad..f5bc10b28b 100644 --- a/extras/mini-os/include/ia64/ia64_cpu.h +++ b/extras/mini-os/include/ia64/ia64_cpu.h @@ -143,11 +143,11 @@ #define STARTUP_PSR (IA64_PSR_IT | \ IA64_PSR_DT | IA64_PSR_RT | MOS_IA64_PSR_BE | \ - IA64_PSR_BN | IA64_PSR_CPL_2 | IA64_PSR_AC) + IA64_PSR_BN | IA64_PSR_CPL_KERN | IA64_PSR_AC) #define MOS_SYS_PSR (IA64_PSR_IC | IA64_PSR_I | IA64_PSR_IT | \ IA64_PSR_DT | IA64_PSR_RT | MOS_IA64_PSR_BE | \ - IA64_PSR_BN | IA64_PSR_CPL_2 | IA64_PSR_AC) + IA64_PSR_BN | IA64_PSR_CPL_KERN | IA64_PSR_AC) #define MOS_USR_PSR (IA64_PSR_IC | IA64_PSR_I | IA64_PSR_IT | \ IA64_PSR_DT | IA64_PSR_RT | MOS_IA64_PSR_BE | \ -- 2.30.2